package com.ikun.common.utils;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;

/**
 * @ClassName ExceptionUtil
 * @Description:
 * @CreateDate: 2024/4/11 9:42
 */
public class ExceptionUtil {


    /**
     * 获取当前异常的方法
     * @param exception
     * @return
     */
    public static String getMethodName(Exception exception) {
        // 获取当前线程的堆栈信息
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 第0个元素是当前方法，第1个元素是调用当前方法的方法
        StackTraceElement caller = stackTrace[2];
        // 获取调用方法的类名和方法名
        String className = caller.getClassName();
        String methodName = caller.getMethodName();
        // 返回方法名
        return className + "." + methodName;
    }

    /**
     * 获取当前异常的参数
     * @param exception
     * @return
     */
    public static Object[] getArguments(Exception exception) {
        // 获取当前线程的堆栈信息
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 第0个元素是当前方法，第1个元素是调用当前方法的方法
        StackTraceElement caller = stackTrace[2];
        // 获取调用方法的类名和方法名
        String className = caller.getClassName();
        String methodName = caller.getMethodName();

        try {
            // 获取调用方法的类对象
            Class<?> clazz = Class.forName(className);
            // 获取调用方法的参数类型
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                    // 返回方法的参数
                    return method.getParameters();
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // 如果获取参数失败，则返回空数组
        return new Object[0];
    }

    /**
     * 通过异常对象获取异常信息
     *
     * @param ex
     * @return
     */
    public static String getExceptionMessage(Exception ex) {
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        //接下来我们就需要将异常栈的信息 打印到这个装饰器的流中
        ex.printStackTrace(printWriter);
        //将打印流中的信息转换成字符串 直接进行返回
        return printWriter.toString();
    }
}
